package ar.edu.utn.frba.proyecto.cruzamiento;

import java.util.HashMap;
import java.util.Map;

import ar.edu.utn.frba.proyecto.interfaces.Cruzable;

public class BinomialAzar implements Cruzable {

	@Override
	public Byte[][] cruzar(Byte[][] info, Object[] parameters) {
		int largoCromosoma=info[0].length;
		Map<Integer, Byte[]> cromosomas= new HashMap<Integer, Byte[]>();
		int cantCruzas=0;
		int maxCruzas=info.length/2;

		Byte[][] result= new Byte[maxCruzas*2][];

		for (int i = 0; i < info.length; i++) {
			cromosomas.put(i, info[i]);
		}
		for (int i=0; i<maxCruzas; i++){
			int pareja1=(int)Math.round((Math.random()*10000))%info.length;
			while (cromosomas.get(pareja1)==null){
				pareja1=(int)Math.round((Math.random()*10000))%info.length;
			}

			int pareja2=(int)Math.round((Math.random()*10000))%info.length;
			while (pareja1==pareja2 || cromosomas.get(pareja2)==null){
				pareja2=(int)Math.round((Math.random()*10000))%info.length;
			}
			Byte[] padre1= cromosomas.get(pareja1);
			Byte[] padre2= cromosomas.get(pareja2);
			cromosomas.put(pareja1, null);
			cromosomas.put(pareja2, null);

			Byte[] hijo1=new Byte[largoCromosoma];
			Byte[] hijo2=new Byte[largoCromosoma];
			//
			for (int j = 0; j < largoCromosoma; j++) {
				if (Math.round((Math.random()*10))%2==0){
					hijo1[j]=padre1[j];
				} else {					
					hijo1[j]=padre2[j];
				} 
				if (Math.round((Math.random()*10))%2==0){
					hijo2[j]=padre1[j];
				} else {
					hijo2[j]=padre2[j];
				}
			}
			//
			result[cantCruzas*2]=hijo1;
			result[cantCruzas*2 +1]=hijo2;
			cantCruzas++;
		}
		return result;
	}

}
